package com.zero.business.order.transfer;

import cn.hutool.core.util.ObjectUtil;
import com.zero.domain.Bicycle;
import com.zero.domain.Member;
import com.zero.business.order.feign.OrderBicycleFeign;
import com.zero.business.order.feign.OrderMemberFeign;
import com.zero.common.exception.ServiceException;
import org.apache.rocketmq.client.producer.SendCallback;
import org.apache.rocketmq.client.producer.SendResult;
import org.apache.rocketmq.spring.core.RocketMQTemplate;
import org.springframework.stereotype.Component;

import javax.annotation.Resource;

/*
*   简单化controller层的代码，中转service请求
* */

@Component
public class OrderTransferService {

    // 获取操作 rocketmq 的对象
    @Resource
    private RocketMQTemplate rocketMQTemplate;

    // feign远程调用类对象
    @Resource
    private OrderBicycleFeign orderBicycleFeign;

    @Resource
    private OrderMemberFeign orderMemberFeign;

    /*
     *   会员使用单车
     *       1.根据 bicycleId 查询单车状态     status=0：未使用 status=1：使用中
     *       2.根据 userId 查询用户状态 ：1.是否有车辆没有归还(status  0：未用车 1：用车中)    2.用户是否还有余额
     *       3.将消息放入 rocketmq 中
     * */
    public void useBicycle(Integer userId, Integer bicycleId) {
        // 拼接 uk ，唯一标识
        String uk = userId + "-" + bicycleId;

        // 1.根据 bicycleId 查询单车状况        远程调用
        Bicycle bicycle = orderBicycleFeign.selectByPrimaryKey(bicycleId);

        if (ObjectUtil.isEmpty(bicycle)){ // 如果不存在该单车
            throw new ServiceException("抱歉，该单车不存在");
        }

        if (bicycle.getStatus()==1) { // 使用中
            throw new ServiceException("抱歉，该单车正在使用中，请选择其他车辆");
        }

        // 到了这一步说明单车可以使用
        // 2.根据 userId 查询用户状态            远程调用
        Member member = orderMemberFeign.selectByPrimaryKey(userId);

        if (member.getStatus()==1) {  // status=1：有车辆未归还
            throw new ServiceException("您还有其他车辆未归还，请先归还该车辆");
        }

        if (member.getMoney().intValue()  <= 0) {
            throw new ServiceException("余额不足，请先充值");
        }

        // 3.到了这一步，说明用户和车辆都没问题，将消息放入 rocketmq (orderTopic主题)
        rocketMQTemplate.asyncSend("orderTopic", uk, new SendCallback() {
            @Override
            public void onSuccess(SendResult sendResult) {
                System.out.println(Thread.currentThread().getName() + " --> 发送成功");
            }

            @Override
            public void onException(Throwable throwable) {
                System.out.println("发送失败" + throwable.getMessage());
                System.out.println("会员ID："+userId + "--车辆ID："+bicycleId);
            }
        });

    }
}
